package com.athena.api.parent;

import java.util.List;

import com.athena.api.model.ImageMetaData;
import com.athena.api.model.Notification;
import com.athena.api.model.TextBook;
import com.athena.api.model.guradian.Cost;
import com.athena.api.model.guradian.Due;
import com.athena.api.model.guradian.GuardianProfileFilter;
import com.athena.api.model.guradian.ParentDetail;
import com.athena.api.model.guradian.ProgressReport;
import com.athena.dal.entities.Guardian;
import com.athena.dal.entities.Student;


/**
 * All the guardian related service will be provided by this interface.
 * @author Pankaj.Mishra
 *
 */
public interface IGuardianService {

	/**
	 * It fetches profile information of guardians. Sometimes it may be necessary in admission process that school might demand for profile
	 * information to be uploaded by the parents before the admission and that of students so that it will be easy for schools to take 
	 * decision based on their profile.
	 * 
	 * @param guardianProfileFilter This will contain general guardian profile filter such as whether he/she english speaking, income range
	 * etc.. This will also contains pagination informations. 
	 * 
	 * @return list of guardians profile which qualify as per filter criteria.
	 */
	public List<Guardian> fetchProfiles(GuardianProfileFilter guardianProfileFilter);
	
	/**
	 * Based on id of a guardian this service provide the profile information of a guardian. Here there might be certain flag that could be used
	 * to fetch only limited set of profile information or detail profile information.
	 * 
	 * @param id This is identifier of guardian profile in our persistent system. 
	 * 
	 * 
	 * @param fetchImage Whether we should also fetch image while fetching profile information or not.
	 * @return Profile information of a guardian.
	 */
	public Guardian getProfile(final int guardianId, final boolean fetchImage ) ;
	
	/**
	 * Images of a guardian. 
	 * 
	 * Comment: while fetching image, should we automatically connect guardian image with student..meaning image uploaded by a students will automatically 
	 * viewable in guardians image ?
	 * @param id
	 * @return list of image
	 */
	public List<String> getImages(final int guardianId);
	
	
	/**
	 * This is for saving edited profile of a guardian. Security could be applied here that only logged in member could edit their profile.
	 * @param id
	 */
	public void saveProfile(Guardian guardian);
	
	/**
	 * upload photo of guardian.
	 * @param id
	 * @param photoData This contains detail of photos being uploaded.
	 */
	public void uploadPhoto(final int guardianId, ImageMetaData photoData);
	
	/**
	 * list of students who are studying in the school, of this particular guardian.
	 * @param id
	 * @return students profile.
	 */
	public List<Student> myStudents(final int guardianId);
	
	
	/**
	 * If there are any dues.
	 * @param id
	 * @return dues
	 */
	public List<Due> getDues(final int guardianId);
	
	
	/**
	 * Progress report of student
	 * @param id
	 * @param studentId
	 * 
	 */
	public ProgressReport getStudentsProgress(final int guardianId, final int studentId);
	
	
	/**
	 * If parent wants to edit his children's profile.Useful whose children are too young to use this software.
	 * 
	 * @param id
	 * @param student
	 */
	public void editStudentsProfile(final int guardianId, Student student);
	
	/**
	 * Apply for a leave.
	 * @param id
	 * @param studentId
	 */
	public void applyForLeave(final int guardianId, final int studentId);
	
	/**
	 * Sometimes student demand for leave and teacher asks students to get guardian's approval.
	 * @param id
	 * @param studentId
	 */
	public void approveStudentLeave(final int guardianId, final int studentId);
	
	
	/**
	 * 
	 * All the prizes that student has won.
	 * @param id
	 * @param studentId
	 */
	public void getStudentsMedals(final int guardianId, final int studentId);

	/**
	 * This is for comparing one students with other. This might give detail information about one student as compared to other student.
	 * @param id
	 * @param firstStudentId
	 */
	public void compareStudentsResult(final int guardianId, final int studentId);
	
	/**
	 * Notifications of parents... such as having parent teacher meeting, or absent of your students or for the events taking place etc..
	 * 
	 * @param id
	 */
	public List<Notification> getNotifications(final int guardianId);
	
	
	/**
	 * Here extracurricular activities that students will be involved in.
	 * @param id
	 * @param studentId
	 */
	public List<String> getStudentsExtracurricularActivities(final int guardianId, final int studentId);
	
	/**
	 * All the students in order of their class rank.
	 * @param id
	 * @param studentId
	 * @return
	 */
	public List<Student> getAllStudentsOfYourStudentsClass(final int guardianId, final int studentId);
	
	/**
	 * 
	 * @param id
	 * @param studentId
	 * @return
	 */
	public List<TextBook> getTextBooks(final int guardianId, final int studentId);
	
	/**
	 * Cost detail of a particular class.
	 * @param classId
	 * @return
	 */
	public List<Cost> getCostDetail(final int classId);
	
	
	/**
	 * Fixing a meeting with a faculty member.Right now it will send a customise message to the teacher and somewhere we will store the timing
	 * of the meeting to send notification to the parent. 
	 * @param id
	 * @param facultyID
	 */
	public void fixAMeating(final int guardianId, final int facultyID);
	
	
	/**
	 * Current home work of students.
	 * @param id
	 */
	public void getStudentsHomeWork(final int guardianId, final int studentId);
	
	
	/**
	 * This will fetch the bill of that parent might be needing for taxing etc. purpose.
	 * @param id
	 * @param studentId
	 * @param classId
	 */
	public void getYourBills(final int guardianId, final int studentId, final int classId);
	
	/**
	 * Whenever parent shift their location or anything they can request school for their student to make arrangement for shifting students.
	 * @param id
	 * @param studentId
	 */
	public void requestForTransfer(final int id, final int studentId);
	
	/**
	 * For a certificate of some kind..Even though these thing can be done through message sending but by providing the template for 
	 * different kind of message can only help parent.
	 * @param id
	 * @param studentId
	 * @param classId
	 * 
	 */
	public void requestForCertificate(final int id, final int studentId, final int classId);
	
	/**
	 * 
	 * @param id
	 * @param studentId
	 */
	public void getTeacherRemarks(final int id, final int studentId);
	
	
	
	
	//////////////////////////////////////////////////////////////////////These are for unregistered parent.
	
	/**
	 * It returns back the detail information class-wise of admission process.
	 * @param classId
	 * @param parentDetail
	 */
	public void requestForAdmission(final int classId, ParentDetail parentDetail);
	

	/**
	 * It returns cost detail of a class. 
	 * @param classId
	 * @param parentDetail
	 */
	public void requestForAdmissionCostDetail(final int classId, ParentDetail parentDetail);
	
}
